package org.codefilarete.stalactite.engine.configurer.model;

import javax.annotation.Nullable;

import org.codefilarete.reflection.ReadWritePropertyAccessPoint;
import org.codefilarete.stalactite.dsl.property.CascadeOptions;
import org.codefilarete.stalactite.sql.ddl.structure.Table;
import org.codefilarete.stalactite.sql.result.BeanRelationFixer;

/**
 * {@link EntityRelation} dedicated to one-to-one
 * 
 * @param <SRC> the entity type owning the relation
 * @param <TRGT> the entity type related to the owning entity type
 * @param <LEFTTABLE> the entity table type owning the relation
 * @param <RIGHTTABLE> the table type of the related entity type
 * @param <JOINTYPE> the type of join used to link the two entities (either source primary or target primary key)
 * @author Guillaume Mary
 */
public class ResolvedOneToOneRelation<SRC, TRGT, LEFTTABLE extends Table<LEFTTABLE>, RIGHTTABLE extends Table<RIGHTTABLE>, JOINTYPE>
		extends EntityRelation<SRC, TRGT, LEFTTABLE , RIGHTTABLE, JOINTYPE> {
	
	private final boolean ownedByTarget;
	
	private final boolean mandatory;
	
	public ResolvedOneToOneRelation(Entity<TRGT, ?, RIGHTTABLE> targetEntity,
	                                ReadWritePropertyAccessPoint<SRC, TRGT> accessor,
	                                @Nullable ReadWritePropertyAccessPoint<TRGT, SRC> mappedByAccessor,
	                                CascadeOptions.RelationMode relationMode,
	                                boolean fetchSeparately,
	                                DirectRelationJoin<LEFTTABLE, RIGHTTABLE, JOINTYPE> join,
	                                BeanRelationFixer<SRC, TRGT> beanRelationFixer,
	                                boolean ownedByTarget,
									boolean mandatory) {
		super(targetEntity, accessor, mappedByAccessor, relationMode, fetchSeparately, join, beanRelationFixer);
		this.ownedByTarget = ownedByTarget;
		this.mandatory = mandatory;
	}
	
	public boolean isOwnedByTarget() {
		return ownedByTarget;
	}
	
	public boolean isMandatory() {
		return mandatory;
	}
}
